package com.example.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.entity.dto.Interact;
import com.example.entity.dto.Topic;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;

import java.util.List;

/**
 * <p>
 * Mapper 接口，用于处理与主题（Topic）相关的数据访问操作，继承自BaseMapper<Topic>，
 * 拥有BaseMapper提供的基础CRUD操作方法，同时自定义了一些特定的数据库操作方法。
 * </p>
 *
 * @author xusen
 * @since 2025-04-28
 */
@Mapper
public interface TopicMapper extends BaseMapper<Topic> {

    /**
     * 批量添加用户与主题的交互记录。
     *
     * @param interacts 包含用户与主题交互信息的Interact对象列表，每个Interact对象记录了一次交互的具体信息。
     * @param type      交互类型，用于确定将交互记录添加到哪个与交互相关的数据库表中（通过表名中的类型标识）。
     *                  方法会根据传入的交互类型和交互信息列表，将交互记录插入到相应的数据库表中。
     */
    void addInteract(List<Interact> interacts, String type);

    /**
     * 批量删除用户与主题的交互记录。
     *
     * @param interacts 包含用户与主题交互信息的Interact对象列表，每个Interact对象记录了一次交互的具体信息。
     * @param type      交互类型，用于确定从哪个与交互相关的数据库表中删除交互记录（通过表名中的类型标识）。
     *                  方法会根据传入的交互类型和交互信息列表，从相应的数据库表中删除对应的交互记录。
     * @return 成功删除的交互记录数量。
     */
    int deleteInteract(List<Interact> interacts, String type);

    /**
     * 查询指定主题（根据主题ID tid）在特定交互类型（type）下的交互记录总数。
     *
     * @param tid 主题ID，用于指定要查询交互记录的主题。
     * @param type 交互类型，通过在SQL语句中拼接表名（db_topic_interact_${type}）来确定查询的交互表。
     *             执行SQL查询语句：select count(*) from db_topic_interact_${type} where tid=#{tid}，
     *             统计符合条件的交互记录数量并返回。
     * @return 指定主题在特定交互类型下的交互记录总数。
     */
    @Select("select count(*) from db_topic_interact_${type} where tid=#{tid}")
    int interactCount(int tid, String type);

    /**
     * 查询指定用户（根据用户ID uid）对指定主题（根据主题ID tid）在特定交互类型（type）下的交互记录数量。
     *
     * @param tid 主题ID，用于指定要查询交互记录的主题。
     * @param uid 用户ID，用于指定要查询交互记录的用户。
     * @param type 交互类型，通过在SQL语句中拼接表名（db_topic_interact_${type}）来确定查询的交互表。
     *             执行SQL查询语句：select count(*) from db_topic_interact_${type} where tid=#{tid} and uid=#{uid}，
     *             统计符合条件的交互记录数量并返回。
     * @return 指定用户对指定主题在特定交互类型下的交互记录数量。
     */
    @Select("select count(*) from db_topic_interact_${type} where tid=#{tid} and uid=#{uid}")
    int userInteractCount(int tid, int uid, String type);

    /**
     * 查询某个用户（根据用户ID uid）收藏的主题信息。
     *
     * @param uid 用户ID，用于指定要查询收藏主题的用户。
     *            执行SQL查询语句：select * from db_topic_interact_collect right join db_topic on tid=db_topic.id where db_topic_interact_collect.uid=#{uid}，
     *            通过右连接（right join）将用户收藏表（db_topic_interact_collect）和主题表（db_topic）连接起来，
     *            根据用户ID筛选出该用户收藏的主题信息，并以Topic对象列表的形式返回。
     * @return 包含用户收藏的主题信息的Topic对象列表。
     */
    @Select("select * from db_topic_interact_collect right join db_topic on tid=db_topic.id where db_topic_interact_collect.uid=#{uid}")
    List<Topic> collectTopics(int uid);
}